package com.fatcat.easybuy.util;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author 郝秦毅
 * @since 2025/9/11 10:17
 */
@Component
public class Sm3Util {
    // 使用非静态setter方法注入静态变量
    private static String key;

    @Value("${Sm3Util.key}")
    public void setKey(String key) {
        Sm3Util.key = key;
    }

    /**
     * HMAC-SM3加密
     *
     * @param data 待加密数据
     * @return 加密后的字符串
     */
    //定义方法，接收字符串类型的待加密数据，返回加密后的二进制字符串
    public static String hmacEncrypt(String data) {
        // 将待加密的字符串转换为字节数组（默认使用平台默认字符集）
        byte[] dataByte = data.getBytes();

        //将密钥字符串转换为字节数组
        byte[] keyByte = key.getBytes();

        //创建密钥参数对象，封装密钥字节数组，用于HMAC初始化
        KeyParameter keyParameter = new KeyParameter(keyByte);

        // 创建SM3消息摘要对象，作为HMAC的底层哈希算法
        SM3Digest sm3Digest = new SM3Digest();

        //创建HMAC对象，指定使用SM3作为哈希算法
        HMac hMac = new HMac(sm3Digest);

        // 初始化HMAC对象，传入密钥参数
        hMac.init(keyParameter);

        //将待加密数据的字节数组更新到HMAC中（从索引0开始，长度为数组总长度）
        hMac.update(dataByte, 0, dataByte.length);

        // 9. 创建接收加密结果的字节数组，长度为HMAC计算结果的长度
        byte[] result = new byte[hMac.getMacSize()];

        // 10. 完成HMAC计算，将结果存入result数组
        hMac.doFinal(result, 0);

        // 11. 将加密后的字节数组转换为十六进制字符串并返回（
        return ByteUtils.toHexString(result);
    }

}
